-- lua基础=======================================
-- nil：类似java的null，表示无效值（判断表达式中等同为false）
-- boolean：true/false
-- number：代表数值
-- string：字符串
-- function：通过 C/Lua 编写的函数，函数也可以作为变量，类似JavaScript
-- userdata：C数据结构，存储数据变量，可以把任何C的任意数据类型存储到lua的变量中使用
-- thread：线程（协同程序-协程，线程对象）
-- table：表，本质关联数组，是一种数据结构，可以用于创建存储不同的数据类型，比如数组list、字典map等。

-- lua
-- print(type("Hello"))
-- print(type(100/2))
-- print(type(print))
-- print(type(true))
-- print(type(nil))
-- print(type({'1','2'}))
-- print(type({name='imooc', age=18}))
-- print("imooc长度为：" .. #"imooc")

-- 声明变量
-- local s = "Hello"
-- local num = 123
-- local bool = false
-- local arr = {'1','2'}
-- local json = {name='imooc', age=18}

--访问table
-- print(arr[1])
-- print(json['name'])
-- print(json.age)

-- 循环
-- 数组打印
-- local arr = {"123", "abc"}

-- for index,value in ipairs(arr) do
--     print(index, value);
-- end
-- map打印
-- local json = {name="imooc", birthday="2025-12-25"}

-- for key,value in pairs(json) do
--     print(key, value);
-- end

-- 条件判断
-- if ((10 / 3 == 5) or (20 / 4 == 5))
-- then
--     print("ok")
-- else
--     print("no-ok")
-- end

-- 获得数组中的string/number/其他类型
-- function getInnerArray(arr)
--     strArr = {};
--     numArr = {};
--     otherArr = {};
--     for index,value in ipairs(arr) do
-- --      print(index, value);
--         if ("string" == type(value)) then
--             table.insert(strArr, value);
--         elseif ("number" == type(value)) then
--             table.insert(numArr, value);
--         else
--             table.insert(otherArr, value);
--         end
--     end
--     totalArr = {};
--     table.insert(totalArr, strArr);
--     table.insert(totalArr, numArr);
--     table.insert(totalArr, otherArr);
--     return totalArr;
-- end

-- local temp = {"123", "abc", 456, 789, false, true, {"x"}};
-- totalArrs = getInnerArray(temp);
-- print(totalArrs);

-- print("=========== 打印输出 ============");
-- for index,value in ipairs(totalArrs[3]) do
--     print(index,value);
-- end

-- -- print(#totalArrs)



-- nginx集成lua ===================

-- 响应方法
-- ngx.say('{"text":"lua返回"}'); 

-- http协议版本
-- ngx.say("HTTP协议版本: " .. ngx.req.http_version());

-- 请求的method
-- ngx.say("请求的method: " .. ngx.req.get_method());

-- 原始的请求头信息
-- ngx.say("原始的请求头信息: " .. ngx.req.raw_header());

-- 获得请求头信息
-- local myHeader = ngx.req.get_headers();
-- ngx.say("获得请求头信息 token: " .. myHeader.token);

-- 获取请求路径
-- ngx.say(ngx.var.uri)

-- 获得请求参数 get路径参数
-- local args = ngx.req.get_uri_args();
-- ngx.say("id: " .. args["id"]);

-- 获得form-data参数 也可以获取json
-- ngx.req.read_body();
-- local form_data = ngx.req.get_post_args();
-- for key,value in pairs(form_data) do
--     ngx.say(key .. value);
-- end


-- 获得json的请求体参数 获取到的是字符串 要获取键值对的需要function解析
-- ngx.req.read_body();
-- local body_data = ngx.req.get_body_data();
-- ngx.say(body_data);

-- -- 发送http请求
-- local url = ngx.var.uri;
-- local m = ngx.HTTP_GET;
-- local args = ngx.req.get_uri_args();

-- if ("GET" == ngx.req.get_method())
-- then 
--      m = ngx.HTTP_GET;
-- elseif ("POST" == ngx.req.get_method()) then
--      m = ngx.HTTP_POST;
-- end
-- local response = ngx.location.capture("/java" .. url,{
--     method = m,
--     -- method = ngx.HTTP_GET, -- 请求方法
--     -- method = ngx.req.get_method, -- 请求方法
--     -- args = {param = 123}, -- 请求参数 get ？后面的
--     -- args = args, -- 请求参数 get ？后面的
--     body = '{"param":"123"}' -- 请求参数 body的 多个参数&拼接

-- });
--  -- 目标路径不存在，无法响应客户端
--  if not response then
--     ngx.exit(404);
-- end
-- -- 只要有响应，不管是200还是5xx状态，直接return
-- ngx.say(response.body);
-- response.status;
-- response.body;
-- response.header;

-- local function send_post(path, params) 
--     local response = ngx.location.capture(path, {
--         method = ngx.HTTP_POST,   
--         args = params  
--     });
--     -- 目标路径不存在，无法响应客户端
--     if not response then
--         ngx.exit(404);
--     end
--     -- 只要有响应，不管是200还是5xx状态，直接return
--     return response.body;
-- end

-- -- 导出函数
-- local http = {
--     send_post = send_post
-- }
-- return http;


-- 导入工具类引用

-- ngx.req.read_body();
-- local body_data = ngx.req.get_body_data();
-- local http = require('http');
-- local send = http.send;
-- local get = http.get;
-- local post = http.post;
-- local url = ngx.var.uri;
-- local args = ngx.req.get_uri_args();

-- -- 发送请求
-- local result = post("/my" .. url,args,body_data);
-- -- 返回响应
-- ngx.say(result);


-- redis

-- 导入redis
-- local resty_redis = require("resty.redis");
-- -- 初始化redis对象
-- local redis = resty_redis:new();
-- -- 设置超时时间，单位ms
-- -- 1. 建立连接的超时时间
-- -- 2. 发送请求的超时时间
-- -- 3. 响应数据的超时时间
-- redis:set_timeouts(5000, 5000， 5000);

-- 引入redis
local redis = require('resty.redis');
-- 初始化redis
local red = redis:new();
red:set_timeouts(5000, 5000, 5000);

-- 设置全局变量
redis_ip = "192.168.30.152";
redis_port = 6379;

-- 从redis中查询数据
local function get_data(key)
    -- 建立连接
    local ok, err = red:connect(redis_ip, redis_port);
    if not ok then
        ngx.log(ngx.ERR, "failed to connect: ", err)
        return
    end

    local res, err = red:auth("SbtyMveYNfLzTks7H0apCmyStPzWJqjy")
    if not res then
        ngx.log(ngx.ERR, "failed to authenticate: ", err)
        return
    end

    -- 查询redis
    local res, err = red:get(key)
    do_gracefully_redis_pool(red);
    return res;
end

-- 在redis中设置数据
local function set_data(key, value)
    -- 建立连接
    local ok, err = red:connect(redis_ip, redis_port);
    if not ok then
        ngx.log(ngx.ERR, "failed to connect: ", err)
        return
    end

    local res, err = red:auth("imooc")
    if not res then
        ngx.log(ngx.ERR, "failed to authenticate: ", err)
        return
    end

    --  设值
    ok, err = red:set(key, value);
    ok, err = red:expire(key, 1500);

    do_gracefully_redis_pool(red);
end


-- 导出函数
local _M = {
    get_data = get_data,
    set_data = set_data
}
return _M;

